package beans;

import java.util.*;
import java.sql.*;

import dbUtil.*;
import utils.*;
import iteradores.IteradorUsuario;

/**
 * Clase que representa el bean de la tabla Usuario de la BD
 * @author José Giménez, Gustavo Planás, Esteban Benítez
 */
public class Usuario extends PgAbm implements Abm
{
    ResultSet rs_usuario;
    private Hashtable th_usuario = new Hashtable();
    
    /**
     * Constructor de la clase Atributo
     */
    public Usuario()
    {
        ArrayList array_campos=new ArrayList();

        //Tabla correspondiente a la clase Usuario
        super.setTableName("Usuario");

        //Campos de la tabla
        array_campos=new ArrayList();
        array_campos.add("idusuario");
        array_campos.add("nombre");
        array_campos.add("apellido");
        array_campos.add("nombreoperativo");
        array_campos.add("nombreusuario");
        array_campos.add("contrasenha");
        array_campos.add("direccion");
        array_campos.add("telefono");
        array_campos.add("telefonomovil");
        array_campos.add("email");
        array_campos.add("observacion");
        array_campos.add("idtipodocumento");
        array_campos.add("nrodocumento");
        array_campos.add("idoperador");

        //Clave primaria de la tabla Usuario
        ArrayList array_claves=new ArrayList();
        array_claves.add("idusuario");

        //Hash para los valores de la tabla
        super.initMapping();

        //Establecer valores de campos y campo clave en el padre
        super.setCampos(array_campos);
        super.setClaves(array_claves);

        super.setSequence("idusuario","usuario_idusuario_seq");
    }
    
    /**
     * Devuelve un Iterador para un Usuario
     * @return Iterador para un Usuario
     */
    public Iterador getIterator() throws Exception
    {
        ResultSet rs_datos = super.getResultSet();
        IteradorUsuario iter = new IteradorUsuario(rs_datos);
        return iter;
    }
    
    /**
     * Setea el valor del ID del usuario seleccionado
     * @param Nuevo ID del usuario
     */
    public void setIdUsuario(String valor)
    {
        setMapValue("idusuario",valor);
    }

    /**
     * Setea el valor del Nombre del usuario seleccionado
     * @param Nuevo Nombre del usuario
     */
    public void setNombre(String valor)
    {
        setMapValue("nombre",valor);
    }

    /**
     * Setea el valor del Apellido del usuario seleccionado
     * @param Nuevo Apellido del usuario
     */
    public void setApellido(String valor)
    {
        setMapValue("apellido",valor);
    }

    /**
     * Setea el valor del Nombre Operativo del usuario seleccionado
     * @param Nuevo Nombre Operativo del usuario
     */
    public void setNombreoperativo(String valor)
    {
        setMapValue("nombreoperativo",valor);
    }

    /**
     * Setea el valor del Nombre de Usuario del usuario seleccionado
     * @param Nuevo Nombre de Usuario del usuario
     */
    public void setNombreUsuario(String valor)
    {
        setMapValue("nombreusuario",valor);
    }

    /**
     * Setea el valor de la Contrasena del usuario seleccionado
     * @param Nueva Contrasena del usuario
     */
    public void setContrasenha(String valor)
    {
        setMapValue("contrasenha",valor);
    }

    /**
     * Setea el valor de la Dirección del usuario seleccionado
     * @param Nueva Dirección del usuario
     */
    public void setDireccion(String valor)
    {
        setMapValue("direccion",valor);
    }
    
    /**
     * Setea el valor del Teléfono del usuario seleccionado
     * @param Nuev Teléfono del usuario
     */
    public void setTelefono(String valor)
    {
        setMapValue("telefono",valor);
    }
    
    /**
     * Setea el valor del Teléfono Móvil del usuario seleccionado
     * @param Nuevo Teléfono Móvil del usuario
     */
    public void setTelefonoMovil(String valor)
    {
        setMapValue("telefonomovil",valor);
    }

    /**
     * Setea el valor del E-mail del usuario seleccionado
     * @param Nuevo E-mail del usuario
     */
    public void setEmail(String valor)
    {
        setMapValue("email",valor);
    }

    /**
     * Setea el valor de la Observación del usuario seleccionado
     * @param Nueva Observación del usuario
     */
    public void setObservacion(String valor)
    {
        setMapValue("observacion",valor);
    }
    
    /**
     * Setea el valor del ID de Tipo de Documento del usuario seleccionado
     * @param Nuevo ID de Tipo de Documento del usuario
     */
    public void setIdTipoDocumento(String valor)
    {
        setMapValue("idtipodocumento",valor);
    }
    
    /**
     * Setea el valor del Nro. de Documento del usuario seleccionado
     * @param Nuevo Nro. de Documento del usuario
     */
    public void setNroDocumento(String valor)
    {
        setMapValue("nrodocumento",valor);
    }
    
    /**
     * Setea el valor del ID del usuario operador
     * @param Nuevo ID del usuario operador
     */
    public void setIdOperador(String valor)
    {
        setMapValue("idoperador",valor);
    }
    
    /**
     * Obtiene el Id del Usuario
     * @return ID del usuario seleccionado
     */
    public String getIdUsuario()
    {
        return (String) getMapValue("idusuario");
    }
    
    /**
     * Obtiene el Nombre del Usuario
     * @return Nombre del usuario seleccionado
     */
    public String getNombre()
    {
        return (String) getMapValue("nombre");
    }

    /**
     * Obtiene el Apellido del Usuario
     * @return Apellido del usuario seleccionado
     */
    public String getApellido()
    {
        return (String) getMapValue("apellido");
    }

    /**
     * Obtiene el Nombre Operativo del Usuario
     * @return Nombre Operativo del usuario seleccionado
     */
    public String getNombreoperativo()
    {
        return (String) getMapValue("nombreoperativo");
    }

    /**
     * Obtiene el Nombre de Usuario del Usuario
     * @return Nombre de Usuario del usuario seleccionado
     */
    public String getNombreUsuario()
    {
        return (String) getMapValue("nombreusuario");
    }

    /**
     * Obtiene el Password del Usuario
     * @return Password del usuario seleccionado
     */
    public String getPassword()
    {
        return (String) getMapValue("contrasenha");
    }

    /**
     * Obtiene la Dirección del Usuario
     * @return Dirección del usuario seleccionado
     */
    public String getDireccion()
    {
        return (String) getMapValue("direccion");
    }

    /**
     * Obtiene el Teléfono del Usuario
     * @return Teléfono del usuario seleccionado
     */
    public String getTelefono()
    {
        return (String) getMapValue("telefono");
    }

    /**
     * Obtiene el Teléfono Móvil del Usuario
     * @return Teléfono Móvil del usuario seleccionado
     */
    public String getTelefonoMovil()
    {
        return (String) getMapValue("telefonomovil");
    }

    /**
     * Obtiene el E-mail del Usuario
     * @return E-mail del usuario seleccionado
     */
    public String getEmail()
    {
        return (String) getMapValue("email");
    }

    /**
     * Obtiene Observación del Usuario
     * @return Observación del usuario seleccionado
     */
    public String getObservacion()
    { 
        return (String) getMapValue("observacion");
    }

    /**
     * Obtiene Id del Tipo de Documento del Usuario
     * @return Id del Tipo de Documento del usuario seleccionado
     */
    public String getIdTipoDocumento()
    {
        return (String) getMapValue("idtipodocumento");
    }
    
    /**
     * Obtiene Nro. del Tipo de Documento del Usuario
     * @return Nro. del Tipo de Documento del usuario seleccionado
     */
    public String getNroDocumento()
    {
        return (String) getMapValue("nrodocumento");
    }

    /**
     * Obtiene el ID del usuario operador
     * @return ID del usuario operador
     */
    public String getIdOperador()
    {
        return (String) getMapValue("idoperador");
    }
    
    /**
     * Obtiene la Cantidad de Filas de la Tabla Usuario
     * @return Cantidad de Filas de la Tabla Usuario
     * @param ID del Usuario, Tipo de Comparación para Búsqueda
     */
    public int getUsuarios(String idusuario, String type) throws Exception{
        String sql_query = "";
        int cant_filas;
        Hashtable th_aux = new Hashtable();
        
        if (idusuario.equalsIgnoreCase("")){
            sql_query = "select * from usuario order by apellido; ";
        }else {
            sql_query = "select * from usuario where idusuario " + type + " " + idusuario + " order by apellido; ";
        }
        
        
        sql_query += getLimitOffset();
        
        Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
                                            ResultSet.CONCUR_READ_ONLY);
              
        // Se ejecuta la consulta y se recupera el ResultSet        
        System.out.println("SQL: "+ sql_query);
        rs_usuario = stm.executeQuery(sql_query);                   
        
        cant_filas = 0;        
        if (rs_usuario.last()) 
        {          
            cant_filas = rs_usuario.getRow();
            rs_usuario.beforeFirst();        
        }
        
        if (rs_usuario != null){
            while (rs_usuario.next()){
                 th_aux.put(rs_usuario.getString(1), rs_usuario.getString(2));
            }
            th_usuario = th_aux;
        }
        
        System.out.println("Cantidad Filas: " + cant_filas);
        return cant_filas;
    }
    
    /**
     * Obtiene Nro. del Tipo de Documento del Usuario
     * @return Nro. del Tipo de Documento del usuario seleccionado
     * @param ID del Usuario
     */
    public String getUsuarioByID(String ID) throws Exception{
        String result = "";
        
        if (!th_usuario.isEmpty()){
            result = (String)th_usuario.get(ID);
        }
        return result;
    }

    /**
     * Devuelve un Iterador con la lista de Todos los Registros
     * @return Iterador con la lista de Todos los Registros
     */
    public Iterador getIteratorAll() throws Exception
    {
        IteradorUsuario iter = new IteradorUsuario(rs_usuario);    
        return iter; 
    }
}